package service

import (
	"admin-system/internal/config"
	"admin-system/internal/model"
	"errors"
	"fmt"
)

// PermissionService 权限服务
type PermissionService struct{}

// NewPermissionService 创建权限服务实例
func NewPermissionService() *PermissionService {
	return &PermissionService{}
}

// List 获取权限列表
func (s *PermissionService) List(page, pageSize int, keyword string) ([]model.Permission, int64, error) {
	var permissions []model.Permission
	var total int64

	db := config.DB

	// 构建查询条件
	query := db.Model(&model.Permission{})
	if keyword != "" {
		query = query.Where("name LIKE ? OR code LIKE ? OR description LIKE ?", 
			"%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
	}

	// 获取总数
	if err := query.Count(&total).Error; err != nil {
		return nil, 0, fmt.Errorf("获取权限总数失败: %v", err)
	}

	// 分页查询
	offset := (page - 1) * pageSize
	if err := query.Offset(offset).Limit(pageSize).Order("id ASC").Find(&permissions).Error; err != nil {
		return nil, 0, fmt.Errorf("获取权限列表失败: %v", err)
	}

	return permissions, total, nil
}

// GetByID 根据ID获取权限
func (s *PermissionService) GetByID(id uint) (*model.Permission, error) {
	var permission model.Permission
	if err := config.DB.First(&permission, id).Error; err != nil {
		return nil, fmt.Errorf("权限不存在: %v", err)
	}
	return &permission, nil
}

// GetByCode 根据权限码获取权限
func (s *PermissionService) GetByCode(code string) (*model.Permission, error) {
	var permission model.Permission
	if err := config.DB.Where("code = ?", code).First(&permission).Error; err != nil {
		return nil, fmt.Errorf("权限不存在: %v", err)
	}
	return &permission, nil
}

// Create 创建权限
func (s *PermissionService) Create(req *model.PermissionCreateRequest) (*model.Permission, error) {
	// 检查权限码是否已存在
	var existingPermission model.Permission
	if err := config.DB.Where("code = ?", req.Code).First(&existingPermission).Error; err == nil {
		return nil, errors.New("权限码已存在")
	}

	// 创建权限
	permission := model.Permission{
		Name:        req.Name,
		Code:        req.Code,
		Description: req.Description,
		Status:      req.Status,
	}

	// 设置默认状态
	if permission.Status == 0 {
		permission.Status = 1
	}

	if err := config.DB.Create(&permission).Error; err != nil {
		return nil, fmt.Errorf("创建权限失败: %v", err)
	}

	return &permission, nil
}

// Update 更新权限
func (s *PermissionService) Update(id uint, req *model.PermissionUpdateRequest) (*model.Permission, error) {
	// 检查权限是否存在
	permission, err := s.GetByID(id)
	if err != nil {
		return nil, err
	}

	// 检查权限码是否被其他权限使用
	if req.Code != permission.Code {
		var existingPermission model.Permission
		if err := config.DB.Where("code = ? AND id != ?", req.Code, id).First(&existingPermission).Error; err == nil {
			return nil, errors.New("权限码已被其他权限使用")
		}
	}

	// 更新权限信息
	permission.Name = req.Name
	permission.Code = req.Code
	permission.Description = req.Description
	permission.Status = req.Status

	if err := config.DB.Save(permission).Error; err != nil {
		return nil, fmt.Errorf("更新权限失败: %v", err)
	}

	return permission, nil
}

// Delete 删除权限
func (s *PermissionService) Delete(id uint) error {
	// 检查权限是否存在
	permission, err := s.GetByID(id)
	if err != nil {
		return err
	}

	// 检查权限是否被角色使用
	var count int64
	if err := config.DB.Model(&model.RolePermission{}).Where("permission_id = ?", id).Count(&count).Error; err != nil {
		return fmt.Errorf("检查权限使用情况失败: %v", err)
	}

	if count > 0 {
		return errors.New("权限正在被角色使用，无法删除")
	}

	// 删除权限
	if err := config.DB.Delete(permission).Error; err != nil {
		return fmt.Errorf("删除权限失败: %v", err)
	}

	return nil
}

// GetAll 获取所有权限（用于角色分配）
func (s *PermissionService) GetAll() ([]model.Permission, error) {
	var permissions []model.Permission
	if err := config.DB.Where("status = ?", 1).Order("id ASC").Find(&permissions).Error; err != nil {
		return nil, fmt.Errorf("获取权限列表失败: %v", err)
	}
	return permissions, nil
}

// BatchCreate 批量创建权限（用于初始化）
func (s *PermissionService) BatchCreate(permissions []model.Permission) error {
	for _, permission := range permissions {
		// 检查权限码是否已存在
		var existingPermission model.Permission
		if err := config.DB.Where("code = ?", permission.Code).First(&existingPermission).Error; err != nil {
			// 权限不存在，创建新权限
			if err := config.DB.Create(&permission).Error; err != nil {
				return fmt.Errorf("创建权限 %s 失败: %v", permission.Code, err)
			}
		}
	}
	return nil
}

// UpdateStatus 更新权限状态
func (s *PermissionService) UpdateStatus(id uint, status int8) error {
	// 检查权限是否存在
	permission, err := s.GetByID(id)
	if err != nil {
		return err
	}

	// 更新状态
	permission.Status = status
	if err := config.DB.Save(permission).Error; err != nil {
		return fmt.Errorf("更新权限状态失败: %v", err)
	}

	return nil
}
